import os
from PIL import Image
from PIL import ImageFile
import time


#====================================获取章节路径====================================#

def sub_path(rootDir):
    dir_path = []
    for root, dirs, files in os.walk(rootDir):            # 分别代表根目录、文件夹
        for dir in dirs:                           # 遍历目录下的子目录
            dir_path.append(os.path.join(root, dir))     # 获取子目录绝对路径
            # print(dir_path)
    return  dir_path

#====================================获取章节路径====================================#


#====================================合成章节长图====================================#
# 注意，章节文件夹中只能放章节文件夹，不能放其他文件夹
def generate_long_img(img_name_list, chapter_name, long_img_dir):

    # 将图片数据流保存在列表中
    IMG = []
    for img_name in img_name_list:
        # 彩图
        # IMG.append(Image.open(os.path.join(chapter_name, img_name)))
        # 灰图
        IMG.append(Image.open(os.path.join(chapter_name, img_name)).convert('L'))

    # 计算生成图片高度
    height_size = 0
    for img in IMG:
        height_size = height_size + img.height

    # 计算生成过程中的参数
    width_size = IMG[0].width       # 可直接换成750
    left = 0
    right = 0

    # 生成一个画布，大小与最终长图一样
    target_img = Image.new(IMG[0].mode, (width_size, height_size))
    
    # 往画布上从上到下贴图片
    for img_file in IMG:
        right = right + img_file.height
        target_img.paste(img_file, (0, left, width_size, right))
        left = left + img_file.height
        
    target_img.save(long_img_dir, quality = 100)   
   
#====================================合成章节长图====================================#


#====================================生成漫画图集====================================#

def Generate_Album(comic_dir, comic_name):

    chapter_dir = sub_path(comic_dir)       # 漫画文件夹的章节文件夹
    dir_img_combine = './Comic_Long_Image/' + comic_name    # 合成的图片文件夹

    if not os.path.exists(dir_img_combine):
        os.makedirs(dir_img_combine)

    #记录开始时间
    time_start = time.time()
    time_now = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time_start))
    print(time_now + ' 开始合并！')
    
    for chapter_name in chapter_dir:
        
        # 遍历章节文件夹获取图片名称列表
        img_list = os.listdir(chapter_name)
        img_num = len(img_list)
        
        # 考虑特殊情况，图片太多导致合成图像素超过限制，考察发现图片数量在200一下
        # 那么在数量超过100的时候，分成两张图片
        if img_num > 100:
            separate = int(img_num / 2)
            img_name_list = img_list[0:separate]
            long_img_dir = dir_img_combine + '/' + chapter_name.split("\\")[-1] + "_01.jpg"
            generate_long_img(img_name_list, chapter_name, long_img_dir)
            img_name_list = img_list[separate+1:]
            long_img_dir = dir_img_combine + '/' + chapter_name.split("\\")[-1] + "_02.jpg"
            generate_long_img(img_name_list, chapter_name, long_img_dir)
        else:
            long_img_dir = dir_img_combine + '/' + chapter_name.split("\\")[-1] + ".jpg"
            generate_long_img(img_list, chapter_name, long_img_dir)
            
        print('文件夹----<' + chapter_name.split("\\")[-1] + '>----合并完成')
        
    #记录结束时间
    time_end = time.time()
    time_now = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time_end))
    total_time = '%.2f' % (time_end - time_start)
    print(time_now + ' 合并结束！')
    print('总耗时： ' + str(total_time) + ' 秒')

#====================================生成漫画图集====================================#



if __name__ == "__main__":

    # 传入需要合并的图片的路径，提取该路径下所有图片合成一张

    # 根据实际情况，传入漫画文件夹路径，循环读取子文件夹中每一章的图片进行合成，
    # 合成的长图存放在漫画文件夹下的长图文件夹，每个长图以子文件夹名字命名

    comic_dir = './薄荷之夏'
    comic_name = '薄荷之夏-灰度'

    Generate_Album(comic_dir, comic_name)










